package cn.edu.tjpu.lxy.epr;

public class TestDriver1 {

	/*
	 * 比较表达式：运算结果是boolean类型，一般用于进行条件判定处理。
	 * instanceof:判定当前实例变量的类型是否为目标类型（对对象类型的实例变量进行判定该变量是什么类型）
	 * 注意：instanceof 判定当前的实例变量是否为目标类型或者目标类型的父类型。
	 *      因为Object是所有的对象类型的父类，所有所有的对象类型变量都是Object类型。
	 *      java中所有的对象类型都是直接或间接继承自Object类。
	 *      
	 *      insatanceof只能判定对象类类型，不能判定基本类型。
	 *                 如果用于判定基本类型，则基本类型需要转换为包装类类型。
	 */
	/*
	 * 相等运算： ==  !=
	 * 进行相等判定，相等判定结果是boolean类型。
	 * 
	 * 对于对象类型进行 == 判定和基本类型会有差异：
	 * 如果是对象类型 使用 == 判定的是两个变量在内存中的存储地址是否相同（引用地址是否相同）
	 * 如果对象类型使用 equals方法进行判定，判定的是两个变量的内容是否相同。
	 * 总结： == 判定的是对象变量的地址是否相同；
	 *       equals判定的是对象变量的内容是否相同；
	 * 
	 */
	
	public static void main(String[] args) {
		// 比较表达式
		test01();
		System.out.println("------------------");
		test02();
		System.out.println("------------------");
		test03();
	}

	/**
	 * 比较运算
	 */
	private static void test01(){
		// 比较运算
		int iNum1 = 20;
		int iNum2 = 21;
		if(iNum1<iNum2){
			System.out.println("iNum1 比iNum2小");
		}else{
			System.out.println("iNum1 比iNum2大");
		}
		
		if(iNum1>iNum2){
			System.out.println("iNum1 比iNum2大");
		}else{
			System.out.println("iNum1 比iNum2小");
		}
	}

	/**
	 * instanceof比较运算
	 */
	private static void test02(){
		String strName = "xiaoming";
		
		//判定一下变量 strName是否为String类型
		
		if(strName instanceof String){
			System.out.println("strName 变量是String.");
		}else{
			System.out.println("strName 变量不是String.");
		}
		
		if(strName instanceof Object){
			System.out.println("strName 变量是Object.");
		}else{
			System.out.println("strName 变量不是Object.");
		}
		
		Integer iNum1 = 20; // Integer 是int的包装类类型，Integer将int转换为对象类型。
		if(iNum1 instanceof Integer){			
		}
	}

	/**
	 * 基本类型-相等判定
	 * 对象类型-相等判定
	 */
	private static void test03() {
		// 相等运算
		int iNum1 = 20;
		int iNum2 = 20;

		if (iNum1 == iNum2) {
			System.out.println("iNum1 和 iNum2相等");
		} else {
			System.out.println("iNum1 和 iNum2不相等");
		}
		
		// 对象类型相等判定
		String strName1 = "小明";
		String strName2 = "小明";
		String strName3 = new String("小明");
		String strName4 = strName1;
		
		/*
		 * java语言中对于变量的存储使用了栈和堆的数据结构进行存储；
		 * java语言对于字符串使用一个相对独立的数据结构叫字符串池（也是一种栈结构）
		 * 
		 * java存储：变量名全部放在栈中；
		 *          常量值放在栈中，栈中的常量可以重复引用；
		 *          对象类型变量值放在堆中（使用new创建的对象的值都是在堆中存储）
		 * 
		 * java字符串常量放在字符串池中；
		 * 
		 * 解析：
		 * 语句： String strName1 = "小明";
		 * 变量名strName1放在栈中；
		 * 语句中的“小明”是一个字符串常量，放在字符串池中；
		 * 语句：String strName2 = "小明";
		 * 变量名strName2放在栈中；
		 * 语句中的“小明”是一个字符串常量，应该放在字符串池中，但是因为字符串池中已经有常量“小明”，直接使用
		 * 已有的“小明”常量即可；
		 * 也就是说执行了上面两条语句以后，字符串池中只有一个字符串常量“小明”，对应两个变量名；
		 * 
		 * 语句：String strName3 = new String("小明");
		 * 变量名strName3在栈中；
		 * 因为使用了new 所以变量strName3的值是在堆中存储；
		 * new创建过程：先在字符串池中创建一个“小明”常量（如果已有，则不需要再新建），然后将字符串池中的
		 * 常量“小明”复制到堆中，这样在堆中存储了一个值为“小明”的堆变量。
		 * 
		 * 语句：String strName4 = strName1;
		 * 赋值语句，也就是strName4指向了strName1变量的值；
		 */
		
		/*
		 * 总结：字符串在初始化创建时，字符串常量是存储在字符串池中（栈）；
		 *      使用new创建或者使用了 “+”拼接的字符串变量则存储在堆中；
		 * 
		 */
		
		
		
		// 使用 == 运算符进行判定
		System.out.println("使用 == 运算符进行判定:");
		System.out.println("strName1 == strName2 判定结果：" + (strName1 == strName2));
		System.out.println("strName1 == strName3 判定结果：" + (strName1 == strName3));
		System.out.println("strName2 == strName3 判定结果：" + (strName2 == strName3));
		System.out.println("strName3 == strName4 判定结果：" + (strName3 == strName4));
		System.out.println("strName1 == strName4 判定结果：" + (strName1 == strName4));
		
		// 使用 equals 方法进行判定
		System.out.println("使用 equals 方法进行判定:");
		System.out.println("strName1.equals(strName2)判定结果：" + strName1.equals(strName2));
		System.out.println("strName1.equals(strName3)判定结果：" + strName1.equals(strName3));
		System.out.println("strName2.equals(strName3)判定结果：" + strName2.equals(strName3));
		System.out.println("strName3.equals(strName4)判定结果：" + strName3.equals(strName4));
		System.out.println("strName1.equals(strName4)判定结果：" + strName1.equals(strName4));
	}
}
